import json
import os
from datetime import datetime
from typing import List, Dict, Any, Optional
from langchain_groq import ChatGroq
from langchain.schema import HumanMessage, SystemMessage
from config.settings import GROQ_API_KEY

class MCPController:
    """
    Model Context Protocol控制器
    负责对AI文献进行深度分析、趋势识别和智能增强
    """
    
    def __init__(self):
        self.llm = ChatGroq(
            temperature=0.2,
            groq_api_key=GROQ_API_KEY,
            model_name="llama-3.3-70b-versatile"  # 使用当前支持的模型
        )
    
    def enhance_agent(self, articles: List[Dict[str, Any]]) -> Optional[str]:
        """
        对收集的文章进行深度分析和增强
        
        Args:
            articles: 处理后的文章列表
            
        Returns:
            增强分析报告的字符串，如果失败则返回None
        """
        if not articles:
            return None
            
        try:
            # 1. 趋势分析
            trend_analysis = self._analyze_trends(articles)
            
            # 2. 技术热点识别
            hot_topics = self._identify_hot_topics(articles)
            
            # 3. 研究方向建议
            research_suggestions = self._generate_research_suggestions(articles)
            
            # 4. 生成综合报告
            enhanced_report = self._generate_enhanced_report(
                articles, trend_analysis, hot_topics, research_suggestions
            )
            
            return enhanced_report
            
        except Exception as e:
            print(f"[ERROR] MCP增强分析失败: {e}")
            return None
    
    def _analyze_trends(self, articles: List[Dict[str, Any]]) -> str:
        """
        分析技术趋势 - 面向研究人员的深度技术分析
        基于最新文献进行系统性的技术趋势识别和分析
        """
        try:
            # 提取关键信息用于趋势分析
            titles = [article.get('title', '') for article in articles[:10]]  # 限制数量避免token超限
            summaries = [article.get('summary_zh', '') for article in articles[:10]]
            
            analysis_content = "\n".join([f"标题: {title}\n摘要: {summary}" for title, summary in zip(titles, summaries)])
            
            # 面向研究人员的技术趋势分析提示词
            # 目标：提供深度的技术洞察和前沿趋势分析
            system_prompt = """你是一位资深的AI/ML研究领域技术趋势分析专家，具有深厚的学术背景和产业洞察。请基于提供的最新AI文献进行系统性的技术趋势分析。

深度分析要求：
1. **技术演进路径分析**：
   - 识别核心技术范式的演进趋势
   - 分析算法架构和方法论的发展方向
   - 评估技术成熟度和发展阶段

2. **前沿技术热点识别**：
   - 新兴技术方向和突破性进展
   - 跨领域技术融合趋势
   - 理论创新与实践应用的结合点

3. **技术生态系统分析**：
   - 主流技术栈的演进趋势
   - 开源生态与商业化路径
   - 标准化和工程化发展方向

4. **研究前沿预测**：
   - 基于当前进展的技术发展预测
   - 潜在的技术瓶颈和突破方向
   - 未来3-5年的重点研究领域

请提供专业的技术分析，使用准确的学术术语，面向具有相关背景的研究人员和技术专家。"""

            user_prompt = f"请对以下AI/ML领域最新文献进行深度技术趋势分析：\n\n{analysis_content[:2000]}"
            
            messages = [
                SystemMessage(content=system_prompt),
                HumanMessage(content=user_prompt)
            ]
            
            response = self.llm.invoke(messages)
            return response.content.strip()
            
        except Exception as e:
            return f"趋势分析失败: {str(e)}"
    
    def _identify_hot_topics(self, articles: List[Dict[str, Any]]) -> str:
        """识别技术热点"""
        try:
            # 统计关键词频率
            all_tags = []
            all_tasks = []
            
            for article in articles:
                if article.get('tags'):
                    all_tags.extend(article['tags'])
                if article.get('tasks'):
                    all_tasks.extend(article['tasks'])
            
            # 简单的频率统计
            tag_freq = {}
            for tag in all_tags:
                tag_freq[tag] = tag_freq.get(tag, 0) + 1
            
            task_freq = {}
            for task in all_tasks:
                task_freq[task] = task_freq.get(task, 0) + 1
            
            # 获取热门标签和任务
            hot_tags = sorted(tag_freq.items(), key=lambda x: x[1], reverse=True)[:10]
            hot_tasks = sorted(task_freq.items(), key=lambda x: x[1], reverse=True)[:10]
            
            hot_topics_summary = "当前技术热点：\n"
            
            if hot_tags:
                hot_topics_summary += "\n热门技术标签：\n"
                for tag, count in hot_tags:
                    hot_topics_summary += f"- {tag} ({count}次提及)\n"
            
            if hot_tasks:
                hot_topics_summary += "\n热门应用领域：\n"
                for task, count in hot_tasks:
                    hot_topics_summary += f"- {task} ({count}次提及)\n"
            
            return hot_topics_summary
            
        except Exception as e:
            return f"热点识别失败: {str(e)}"
    
    def _generate_research_suggestions(self, articles: List[Dict[str, Any]]) -> str:
        """
        生成研究方向建议 - 面向研究人员的专业研究指导
        基于前沿文献分析提供具体的研究方向和机会识别
        """
        try:
            # 基于文章内容生成研究建议
            recent_titles = [article.get('title', '') for article in articles[:5]]
            
            # 面向研究人员的专业研究建议提示词
            # 目标：提供具有学术价值和实践意义的研究方向指导
            system_prompt = """你是一位资深的AI/ML研究领域学术顾问和研究战略专家，具有丰富的科研指导经验。基于最新的AI文献，请为研究人员提供专业的研究方向建议和战略指导。

专业建议框架：
1. **前沿研究机会识别**：
   - 基于当前进展识别研究空白和机会点
   - 分析技术瓶颈和潜在突破方向
   - 评估研究问题的学术价值和创新潜力

2. **跨领域融合研究**：
   - 识别多学科交叉的研究机会
   - 分析技术迁移和方法论借鉴的可能性
   - 评估跨领域合作的潜在价值

3. **方法论创新方向**：
   - 算法架构的改进和创新空间
   - 理论基础的深化和扩展机会
   - 评估指标和基准测试的完善需求

4. **实践应用导向研究**：
   - 从理论到应用的转化路径
   - 工程化和产业化的技术需求
   - 社会影响和伦理考量的研究方向

5. **具体研究建议**：
   - 短期（6-12个月）可执行的研究项目
   - 中期（1-3年）的研究规划
   - 长期（3-5年）的战略研究方向

请提供具有可操作性的专业建议，包含具体的研究问题、方法论建议和预期贡献。"""

            user_prompt = f"基于以下AI/ML领域最新研究进展，请为研究人员提供专业的研究方向建议：\n\n" + "\n".join(recent_titles)
            
            messages = [
                SystemMessage(content=system_prompt),
                HumanMessage(content=user_prompt)
            ]
            
            response = self.llm.invoke(messages)
            return response.content.strip()
            
        except Exception as e:
            return f"研究建议生成失败: {str(e)}"
    
    def _generate_enhanced_report(self, articles: List[Dict[str, Any]], 
                                trend_analysis: str, hot_topics: str, 
                                research_suggestions: str) -> str:
        """生成增强分析报告"""
        
        report_lines = []
        report_lines.append("=" * 60)
        report_lines.append("DeepTrend AI文献智能分析增强报告")
        report_lines.append("=" * 60)
        report_lines.append(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        report_lines.append(f"分析文章数量: {len(articles)}")
        report_lines.append("")
        
        # 数据源统计
        source_stats = {}
        for article in articles:
            source = article.get('source_name', article.get('source', 'Unknown'))
            source_stats[source] = source_stats.get(source, 0) + 1
        
        report_lines.append("📊 数据源分布:")
        for source, count in sorted(source_stats.items(), key=lambda x: x[1], reverse=True):
            report_lines.append(f"  • {source}: {count}篇")
        report_lines.append("")
        
        # 趋势分析
        report_lines.append("🔍 技术趋势分析:")
        report_lines.append("-" * 40)
        report_lines.append(trend_analysis)
        report_lines.append("")
        
        # 技术热点
        report_lines.append("🔥 技术热点统计:")
        report_lines.append("-" * 40)
        report_lines.append(hot_topics)
        report_lines.append("")
        
        # 研究建议
        report_lines.append("💡 研究方向建议:")
        report_lines.append("-" * 40)
        report_lines.append(research_suggestions)
        report_lines.append("")
        
        # 重点文章推荐
        report_lines.append("⭐ 重点文章推荐:")
        report_lines.append("-" * 40)
        
        # 选择前5篇文章作为重点推荐
        for i, article in enumerate(articles[:5], 1):
            report_lines.append(f"{i}. {article.get('title', 'N/A')}")
            report_lines.append(f"   来源: {article.get('source_name', 'N/A')}")
            report_lines.append(f"   链接: {article.get('url', 'N/A')}")
            if article.get('summary_zh'):
                summary = article['summary_zh'][:100] + "..." if len(article['summary_zh']) > 100 else article['summary_zh']
                report_lines.append(f"   摘要: {summary}")
            report_lines.append("")
        
        report_lines.append("=" * 60)
        report_lines.append("报告结束")
        report_lines.append("=" * 60)
        
        return "\n".join(report_lines)